/*
题目: 尽可能使字符串相等
给你两个长度相同的字符串，s 和 t。

将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销（开销可能为 0），也就是两个字符的 ASCII 码值的差的绝对值。

用于变更字符串的最大预算是 maxCost。在转化字符串时，总开销应当小于等于该预算，这也意味着字符串的转化可能是不完全的。

如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串，则返回可以转化的最大长度。

如果 s 中没有子字符串可以转化成 t 中对应的子字符串，则返回 0。

https://leetcode.cn/problems/get-equal-substrings-within-budget
 */
public class EqualSubstring {
    public int equalSubstring(String s, String t, int maxCost) {
        // 滑动窗口优化, 保持 滑动窗口 的不减性
        int n = s.length();
        int left = 0;
        int cost = 0; // 当前花费

        for (int i = 0; i < n; i ++) {
            cost += Math.abs(s.charAt(i) - t.charAt(i));

            // 只移动一次, 因为更小的窗口肯定不是 src
            // 保持 滑动窗口 的 不减性
            if (cost > maxCost) {
                cost -= Math.abs(s.charAt(left) - t.charAt(left));
                left ++;
            }
        }

        return n - left;
    }
}
